// cf-gym-100570-c
// 题意：
// 给定一个n*m(n, m<=400)的矩阵a[i][j](<=10^9)，现在有q(<=10)个询问，
// 每个询问给定一个k(<=10^9)，要求最大值减最小值不超过k的子矩形的个数。
//
// 题解：
// 考虑这个问题的一维情况，只需要用单调队列就可以搞定。那么二维只需要
// 枚举行的范围，转为一维就行。
//
// 也可以考虑梯形轮廓线，然后用二维st预处理rmq，最后对每个点，沿着轮廓线
// 走一遍，不过常熟会大一点。
//
// ml:run = $bin < input
// ml:opt = 0
// ml:ccf += -g
#include <iostream>
#include <algorithm>

using ll = long long;

int const maxn = 500;
int da[maxn][maxn];
int a[maxn], b[maxn];
int query[20];
ll ans[20];
int n, m, q;
int qmax[4 * maxn], qmin[4 * maxn];

ll calc(int k)
{
    int head1 = 1, tail1 = 0;
    int head2 = 1, tail2 = 0;
    int left = 1;
    ll ret = 0;
    for (int i = 1; i <= m; i++) {
        while (head1 <= tail1 && a[i] > a[qmax[tail1]]) tail1--;
        qmax[++tail1] = i;
        while (head2 <= tail2 && b[i] < b[qmin[tail2]]) tail2--;
        qmin[++tail2] = i;
        while (head1 <= tail1 && head2 <= tail2 && a[qmax[head1]] - b[qmin[head2]] > k) {
            left++;
            if (qmax[head1] < left) head1++;
            if (qmin[head2] < left) head2++;
        }
        ret += i - left + 1;
    }
    return ret;
}

int main()
{
    std::ios_base::sync_with_stdio(false);
    std::cin >> n >> m >> q;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++) std::cin >> da[i][j];

    for (int i = 0; i < q; i++) std::cin >> query[i];

    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) a[j] = b[j] = da[i][j];
        for (int j = i; j <= n; j++) {
            if (j != i) {
                for (int k = 1; k <= m; k++) {
                    a[k] = std::max(a[k], da[j][k]);
                    b[k] = std::min(b[k], da[j][k]);
                }
            }

            for (int qi = 0; qi < q; qi++)
                ans[qi] += calc(query[qi]);
        }
    }

    for (int i = 0; i < q; i++)
        std::cout << ans[i] << "\n";
}

